

var mod_myApp = angular.module('myApp',['ngRoute']);

// mod_myApp.config(['$routeProvider', function($routeProvider){
// 	$routeProvider
// 		.when('/',{
// 			templateUrl: 'pub_personal.html',
// 		})
// 		.when('/edit',{
// 			templateUrl: 'pub_editor.html',
// 		})
// 		.when('/main',{
// 			templateUrl: 'main.php',
// 		})
// 		.otherwise({
// 			redirectTo: '/'
// 		});
// }])
// .config(['$locationProvider', function($locationProvider) {
// 	$locationProvider.html5Mode(false);
// 	//$locationProvider.hashPrefix('!');
// }])
// ;


mod_myApp
//注意，这里是.run()，不同于下面子作用域使用.controller()
//“在JS代码中通过run方法来访问$rootScope” （《AngularJS权威教程》P59）
.run(function($rootScope)
{
	$rootScope.globalclock = "heRe is a global att..";

	$rootScope.globalCounter = {
		num: 10
	};

	//$rootScope.testFun = new function(){alert("from testFun()..")};
})
//注意，服务 工场 .factory() 的使用；声明一个greeter服务，在其它控制器中使用时，需要将greeter作为参数传递（“注入”）进去；见P109，P115
.factory('greeter', function(){

	var anotherHello = function(msg)
	{
		alert(msg + " with num= " + num++);
	}

	//注意，“服务是单例对象”，服务实例的创建（即.factory()第二次参数所做的事）在应用的生命周期内只会被调用一次；其内的属性等对于所有调用其的控制器、指令等都是同一个实例，因此可以发现该属性num对于外部都是同一个对象。
	var num = 0;

	return {
		greet : function(msg){alert(msg + " with num= " + num++);},
		//注意，以下两者效果一样
		//anotherGreet : function(msg){anotherHello(msg);},
		anotherGreet : anotherHello,
	}
})
.controller('HelloController',
	//注意，这里多传递了一下greeter参数进去，其为一下服务，见P109
	//“将服务的名字当作参数传递给控制器函数，可以将服务注入到控制器中”，P116
	function($scope, greeter)
	{

		$scope.sayHello = function(){
			greeter.greet("Hello");
		};

		$scope.sayAnotherHello = function()
		{
			greeter.anotherGreet("Hello from anotherGreet");
		};

		var updateClock =function()
		{
			$scope.clock = new Date();
		};

		setInterval(function() {$scope.$apply(updateClock);}, 1000);

		updateClock();

		$scope.counter=100;
		$scope.add = function(num){$scope.counter+=num;};
		$scope.subtract = function(num){$scope.counter-=num;};

		//注意，见《angularJS权威教程》P62页，在JS中，字符串对象是值复制的（数字、布尔型变量也是，数组、对象和函数是引用复制），所以在父、子控制器的changeParentValue()和changeChildValue()中分别改变someBareValue值时，两者的someBareValue不会相互受影响，说明其是值复制的； 而对象的属性如果是字符串型的，则“通过引用进行共享”，因此改变$scope.someModel.someValue值，会在父、子之间相互影响
		//（对上面注释更新）经过测试，好像上面说法不是很对；当为“$scope.someModel.someValue”形式时，可以知道此时someModel为引用类型的对象，对其属性的调用当然就是引用“复制”的，而跟其属性为字符串型无关，即使为数字、布尔型和数组、对象、函数都一样……；可以从 http://jsbin.com/somikicoqa/1/edit 和书中P79关于作用域的例子看出。
		$scope.someBareValue = "hello from parent";
		$scope.someModel =
		{
			someValue : "hello from parent"
		};
		$scope.changeParentValue = function(){
			$scope.someBareValue = "hello from parent";
			$scope.someModel.someValue = "hello from parent";
		}
	}
)
//注意，这里即使把childController这一项提到HelloController前面，也不会有影响，说明其声明顺序无关
.controller('childController',
	function($scope)
	{
		$scope.child = {text: "here is the text of child scope " + $scope.counter};

		//注意，子控制器可以重写父控制器的方法
		$scope.add = function(num){$scope.counter-=num;};

		$scope.changeChildValue = function(){
			$scope.someBareValue = "hello from child";
			$scope.someModel.someValue = "hello from child";
		}

		$scope.cities = [
			{name: 'Seattle'},
			{name: 'San Francisco'},
			{name: 'Chicago'},
			{name: 'New York'},
			{name: 'Boston'}
		];
	}
)
.controller('anotherController', 
	function($scope, $timeout)
	{
		//this.clock = new Date();
		$scope.clock = new Date();

		//注意，ng-disabled的使用
		$scope.isDisabled = true;

		$scope.trueOrFalse = true;

		//注意，$timeout() 计时 延时 的使用；
		//关于文本框输入的延时响应，在P117有一个不错的例子
		$timeout(function() {
			$scope.isDisabled = false;
			//注意，使用了ng-Href和ng-src，可以实现在设置了myHref和myImg之后才使链接有效; 如果使用原始的href属性，则不行, 会在等待时出现无效链接
			$scope.myHref = "http://www.baidu.com";
			$scope.myImg = "imgs/Cesium三模式_2D.jpg";

			$scope.trueOrFalse = !$scope.trueOrFalse;
		}, 1000);

		$scope.person = {
			name: null
			};
			$scope.people = [];
			$scope.submit = function() {
			if ($scope.person.name) {
			$scope.people.push({name: $scope.person.name});
			$scope.person.name = '';
			}
		};
	}
)
.controller('sameController', function($scope){
	$scope.globalCounter.num ++;
	console.log("initializing sameController..." + $scope.globalCounter.num);


})

;



mod_myApp
.filter('capitalize', function(){
	return function(input){
		if(input)
		{
			return input[0].toUpperCase() + input.slice(1);
		}
	}
});

//注意，测试自定义指令 .directive(); 见《angularJS权威教程》P72、P80、P81页；
mod_myApp
.directive('myDirective', function(){
	return {
		restrict: "EAC",
		replace: true,
		scope:
		{
			myUrl : "@",
			withAttr : "@haha",
			ngModel: '=',
			anotherModel : "=eeTfRf",
			onSend: "&"
		},
		template: "<a href='{{myUrl}}' > {{withAttr}} here to Baidu, {{ngModel}}, {{anotherModel}}</a>"
	};
});

//注意，自定义指令.directive()中transclude参数的使用；嵌入
mod_myApp
.directive('sidebox', function() {
	return {
		restrict: 'EA',
		scope: {
			title: '@'
		},
		transclude: true,
		template: function(){return '<div class="sidebox">\
			<div class="content">\
			<h2 class="header">{{ title }}</h2>\
			<span class="content" ng-transclude>\
			</span>\
			</div>\
			</div>';}
	};
});